package xiaolei.gao.servlet;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.stream.Collectors;

import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import xiaolei.gao.entity.Student;
import xiaolei.gao.jdbc.DBUtil;

@SuppressWarnings("serial")
@WebServlet(urlPatterns = { "/stu" })
public class StudentServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("get:" + req.getContentType());
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		Jsonb jsonb = JsonbBuilder.create();
		String postJsonString = new BufferedReader(new InputStreamReader(req.getInputStream(),"UTF-8")).lines()
				.collect(Collectors.joining(System.lineSeparator()));
		Student stu = jsonb.fromJson(postJsonString, Student.class);
		System.out.println(postJsonString);
		// 不能显式conn.close(),否则再次执行时会抛异常-连接已关闭。
		try (Connection conn = DriverManager.getConnection(DBUtil.URL, DBUtil.NAME, DBUtil.PASSWORD)) {
			PreparedStatement ps = null;
			ps = conn.prepareStatement("insert into `user` (`name`,`age`) values(?,?)");
			ps.setString(1, stu.getName());
			ps.setInt(2, stu.getAge());
			ps.executeUpdate();
			resp.setContentType("application/json");
			resp.setCharacterEncoding("UTF-8");
			resp.getWriter().println("{\"code\":0,\"msg\":" + "操作成功}");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/*
	 * 注意，Connection预设为自动“认可/提交”（Commit），也就是Statement执行SQL叙述完后，马上对数据库进行操作变更.
	 * 如果想要对Statement要执行的SQL进行除错，可以使用setAutoCommit(false)来将自动认可取消，在执行完SQL之后，
	 * 再呼叫Connection的commit()方法认可变更， 使用Connection的getAutoCommit()可以测试是否设定为自动认可。
	 * 不过无论是否有无执行commit()方法，只要SQL没有错，在关闭Statement或Connection前，都会执行认可commit动作，
	 * 对数据库进行变更。
	 */

	// 使用JDK 7的try(){}资源句式：可以 try 一个或多个资源，使用try资源句式可以自动 close
	// 资源。如：conn.close();stmt.close();rs.close();
	// 通过数据库的连接操作数据库，实现增删改查

}
